/*
 * UMuxerWriter.cpp
 *
 *  Created on: 2020年7月18日
 *      Author: terry
 */

#include "UMuxerWriter.h"


UMuxerWriter::UMuxerWriter(int fileFormat, UMediaMuxerPtr muxer):
    m_fileFormat(fileFormat),
    m_muxer(muxer),
    m_opened()
{
    UMediaMuxer::Sink sink = std::bind(&UMuxerWriter::onMuxerPacket, this, std::placeholders::_1);
    m_muxer->setSink(sink);
}

UMuxerWriter::~UMuxerWriter()
{
    close();
}

bool UMuxerWriter::open(const char* filename, const UMediaFormat& fmt)
{
    m_format = fmt;

    if (!doOpen(filename))
    {
        return false;
    }

    m_opened = true;

	return true;
}

void UMuxerWriter::close()
{
    if (!m_opened)
    {
        return;
    }

    m_opened = false;

    doClose();
}

bool UMuxerWriter::isOpen()
{
	return m_opened;
}

bool UMuxerWriter::getFormat(UMediaFormat& fmt)
{
    fmt = m_format;
	return m_format.isValid();
}

bool UMuxerWriter::write(UMediaPacket& pkt)
{
    if (!m_opened)
    {
        return false;
    }

	return m_muxer->input(pkt);
}

/**
 * 设置输出文件路径. 可用于切换录像
 * @param filepath	文件路径
 * @return true 表示成功
 */
bool UMuxerWriter::setFile(const char* filepath)
{
    doClose();

    return doOpen(filepath);
}

int UMuxerWriter::getFileFormat()
{
	return m_fileFormat;
}

void UMuxerWriter::onMuxerPacket(UMediaPacket& pkt)
{
    if (!m_opened)
    {
        return;
    }

    m_fileWriter.write(pkt.data(), pkt.size());
}


bool UMuxerWriter::doOpen(const char* filepath)
{
    if (!m_fileWriter.open(filepath, "wb"))
    {
        return false;
    }

    if (!m_muxer->open(m_format))
    {
        return false;
    }

    return true;
}

void UMuxerWriter::doClose()
{
    if (m_muxer)
    {
        m_muxer->close();
    }

    m_fileWriter.close();
}

